#include <iostream>

// 奇异递归  实现多态没有成本
// 把子类作为模版传给父类

template <typename T>
class Base
{
public:
    void show()
    {
        ((T *)this)->show();
    }
};

class Derived : public Base<Derived>  // Derived 继承自 Base<Derived>，这使得 Derived 成为 Base 模板的一个实例。
{
public:
    void show()
    {
        std::cout << "helloworld" << std::endl;
    }
};

template <typename T>
class Animal
{
public:
    void speak()
    {
        ((T *)this)->speak();
    }
};

class Dog : public Animal<Dog>
{
public:
    void speak()
    {
        std::cout << "汪汪汪" << std::endl;
    }
};

class Cat : public Animal<Cat>
{
public:
    void speak()
    {
        std::cout << "喵喵喵" << std::endl;
    }
};

template <typename T>
void Speak(Animal<T> & a)
{
    a.speak();
}

int main()
{
    // Base<Derived> *b = new Derived;  // 创建了一个指向 Derived 对象的 Base<Derived> 指针 b。
    // b->show();  // 实际调用的是 Derived 类中的 show 方法;
    // 因为在 Base 的 show 方法中使用了 ((T *)this)->show()，它会将 this 转换为 Derived*，然后调用 Derived 的 show 方法。

    Dog d;
    Cat c;
    Speak(d);
    Speak(c);
    std::cout<<sizeof(d)<<std::endl; // c++中空类至少占一个字节 因为类需要实例化对象，析构的时候得找到它的内存；   C语言中空结构体占0个字节(结构体是成员变量的集合，没有变量就是没有内存)
    return 0;
}
